} pipeline_info[GSK_VULKAN_N_PIPELINES] = {
{ "blit", gsk_vulkan_blend_pipeline_new },
{ "color", gsk_vulkan_color_pipeline_new },
+ { "color-clip", gsk_vulkan_color_pipeline_new },
{ "color-clip-rounded", gsk_vulkan_color_pipeline_new }
};
case GSK_COLOR_NODE:
if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds))
pipeline_type = GSK_VULKAN_PIPELINE_COLOR;
+ else if (constants->clip.type == GSK_VULKAN_CLIP_RECT)
+ pipeline_type = GSK_VULKAN_PIPELINE_COLOR_CLIP;
else if (constants->clip.type == GSK_VULKAN_CLIP_ROUNDED_CIRCULAR)
pipeline_type = GSK_VULKAN_PIPELINE_COLOR_CLIP_ROUNDED;
else
for (step = 1; step + i < self->render_ops->len; step++)
{
- if (g_array_index (self->render_ops, GskVulkanOp, i + step).type != GSK_VULKAN_OP_COLOR)
+ GskVulkanOp *cmp = &g_array_index (self->render_ops, GskVulkanOp, i + step);
+ if (cmp->type != GSK_VULKAN_OP_COLOR ||
+ cmp->render.pipeline != current_pipeline)
break;
}
current_draw_index += gsk_vulkan_color_pipeline_draw (GSK_VULKAN_COLOR_PIPELINE (current_pipeline),
typedef enum {
GSK_VULKAN_PIPELINE_BLIT,
GSK_VULKAN_PIPELINE_COLOR,
+ GSK_VULKAN_PIPELINE_COLOR_CLIP,
GSK_VULKAN_PIPELINE_COLOR_CLIP_ROUNDED,
/* add more */
GSK_VULKAN_N_PIPELINES
--- /dev/null
+#version 420 core
+
+layout(location = 0) in vec4 inColor;
+
+layout(location = 0) out vec4 color;
+
+void main()
+{
+ color = vec4(inColor.rgb * inColor.a, inColor.a);
+}
--- /dev/null
+#version 420 core
+
+layout(location = 0) in vec4 inRect;
+layout(location = 1) in vec4 inColor;
+
+layout(push_constant) uniform PushConstants {
+ mat4 mvp;
+ vec4 clip_bounds;
+ vec4 clip_widths;
+ vec4 clip_heights;
+} push;
+
+out gl_PerVertex {
+ vec4 gl_Position;
+};
+
+layout(location = 0) out vec4 outColor;
+
+vec2 offsets[6] = { vec2(0.0, 0.0),
+ vec2(1.0, 0.0),
+ vec2(0.0, 1.0),
+ vec2(0.0, 1.0),
+ vec2(1.0, 0.0),
+ vec2(1.0, 1.0) };
+
+vec4 intersect(vec4 a, vec4 b)
+{
+ a = vec4(a.xy, a.xy + a.zw);
+ b = vec4(b.xy, b.xy + b.zw);
+ vec4 result = vec4(max(a.xy, b.xy), min(a.zw, b.zw));
+ if (any (greaterThanEqual (result.xy, result.zw)))
+ return vec4(0.0,0.0,0.0,0.0);
+ return vec4(result.xy, result.zw - result.xy);
+}
+
+void main() {
+ vec4 rect = intersect(inRect, push.clip_bounds);
+
+ vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
+ gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ outColor = inColor;
+}